# coding=utf-8
import requests  # 导入第三方库
from lxml import etree  # 导入第三方库
import csv  # 导入第三方库


def collect(ID, name):  # 定义爬虫函数
    csv.writer(open(f'{name}.csv', 'w', encoding='utf-8-sig', newline='')).writerow(  # 指定保存位置参数
        ['rank', 'name', 'singer', 'length', 'songUrl', 'singerUrl'])  # 利用csv库写入表头
    url = f'https://y.qq.com/n/ryqq/toplist/{ID}'  # 指定爬取的地址
    headers = {'user-agent': ua}  # 设置请求头
    page = requests.get(url=url, headers=headers).content.decode('utf-8')  # 利用requests请求数据返回html
    tree = etree.HTML(page)  # 利用etree实例化tree对象
    for li in tree.xpath('//ul[@class="songlist__list"]/li'):  # 循环遍历每一行音乐
        row = [  # 定义数据列表
            li.xpath('.//div[contains(@class,"songlist__number")]/text()')[0],  # 利用xpath语句提取出排名
            li.xpath('.//span[@class="songlist__songname_txt"]/a/@title')[0],  # 利用xpath语句提取出歌名
            '/'.join(li.xpath('.//div[@class="songlist__artist"]/a/text()')),  # 利用xpath语句提取出歌手
            li.xpath('.//div[@class="songlist__time"]/text()')[0],  # 利用xpath语句提取出时长
            'https://y.qq.com' + li.xpath('.//span[@class="songlist__songname_txt"]/a[last()]/@href')[0],
            # 利用xpath语句提取出歌曲链接
            '/'.join('https://y.qq.com' + i for i in li.xpath('.//div[@class="songlist__artist"]/a/@href'))
            # 利用xpath语句提取出歌手链接
        ]
        print(row)  # 打印数据列表
        csv.writer(open(f'{name}.csv', 'a', encoding='utf-8-sig', newline='')).writerow(row)  # 利用csv库写入数据列表


if __name__ == '__main__':  # 程序入口
    ua = 'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.106Safari/537.36'  # 设置浏览器表头
    collect('26', 'QQ音乐热歌榜')  # 爬取热歌榜
    collect('52', 'QQ音乐原创榜')  # 爬取原创榜



